﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;


namespace FrbaCommerce.ABM_Rol
{
    public partial class ModificacionRol : Form
    {

        public Int32 idRolAModificar;
        private Gets_and_Sets.Rol_getset rolAnt;
        
        private List<int> funcionalidadesRolAnterior = new List<int>();


        private struct Funcionalidad
        {
            public int id;
            public string nombre  {get; set;}
        };

        public ModificacionRol(int idSelect)
        {
            InitializeComponent();
            this.idRolAModificar = idSelect;


            //completo manualmente el comboboxHabilitado
            comboBoxHabilitado.Items.Add("Habilitado"); 
            comboBoxHabilitado.Items.Add("Deshabilitado");

            SqlConnection con = Program.obtenerConexion();

            SqlCommand leerFuncionalidades = Codigo_reutilizable.FuncionesBaseDatos.crearProcedure("GD1C2014.dbo.funcionalidadesDelRol", con,
            new SqlParameter("@Rol", idRolAModificar));
            SqlDataReader lector = leerFuncionalidades.ExecuteReader();


            if (lector.HasRows)
            {
                while (lector.Read())
                {
                    Funcionalidad func = new Funcionalidad();
                    func.id = Convert.ToInt32(lector.GetValue(0));
                    func.nombre = lector.GetString(1);
                    listBoxFuncionalidades.Items.Add(func.nombre);
                }
            }
            
            cargarDatosDelRolSeleccionado();

        }

        private void cargarDatosDelRolSeleccionado()
        {

            rolAnt = AccessData.adRol.obtenerRol(idRolAModificar);

            textBoxNombre.Text = rolAnt.Nombre;
            if (rolAnt.Habilitado.Equals(1))
            {
                comboBoxHabilitado.Text = "Habilitado";
            }
            else
            {
                comboBoxHabilitado.Text = "Deshabilitado";
            }


            List<String> todasFunc = AccessData.adFuncionalidades.FuncExistentes();
            comboBoxFuncionalidades.DataSource = todasFunc;
        }




        private void buttonAdd_Click(object sender, EventArgs e)
        {
            if (comboBoxFuncionalidades.SelectedItem != null && !listBoxFuncionalidades.Items.Contains(comboBoxFuncionalidades.SelectedItem))
                listBoxFuncionalidades.Items.Add(comboBoxFuncionalidades.SelectedItem);
        }

        private void buttonRmv_Click(object sender, EventArgs e)
        {
            if (listBoxFuncionalidades.SelectedItem != null)
                listBoxFuncionalidades.Items.Remove(listBoxFuncionalidades.SelectedItem);
        }






        private void button1_Click(object sender, EventArgs e)
        {
            Gets_and_Sets.Rol_getset rolModificado = new Gets_and_Sets.Rol_getset();

            try
            {
                //busco las funcionalidades del rol anterior y las pongo en una lista
                funcionalidadesRolAnterior = AccessData.adRol.buscarFuncDe(idRolAModificar);

                //Modifico el rol con datos correctos
                inicializarRol(rolModificado);
                AccessData.adRol.actualizarRol(rolModificado, idRolAModificar);

                //Elimino todas las funcionalidades del rol y agrego las nuevas


                //creo lista de funcionalidades a agregar
                List<int> funcParaAgregar = new List<int>();

                //agrego las funcionalidades nuevas a la lista funcParaAgregar
                foreach (String funcActual in listBoxFuncionalidades.Items)
                {
                    int func = AccessData.adFuncionalidades.obtenerIdFuncionalidad(funcActual);
                    
                    funcParaAgregar.Add(func);
                }

                //borro las funcionalidades actuales del rol
                //inserto las funcionalidades nuevas del rol
                AccessData.adRol.borrarFuncionalidadesRol(idRolAModificar);
                AccessData.adRol.agregarFuncionalidadesRol(idRolAModificar, funcParaAgregar);

                this.Close();
                
            }
            

            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        //esta funcion se creo para informar si una funcionalidad es de un rol, pero se iba a usar en la modificacion de las funcionalidades del rol, y luego se opto por otra metodologia.
        //no se borra por si en el transcurso del desarrollo es util para otra tarea.
        private Boolean esFuncionalidadRol(int funcionalidad, int idRol)
        {
            Boolean retorno = false;
            List<int> funcionalidadesDelRol = new List<int>();
            funcionalidadesDelRol = AccessData.adRol.buscarFuncDe(idRol);

            foreach (int f in funcionalidadesDelRol)
                if (f == funcionalidad)
                {
                    retorno = true;
                }
                else
                {
                    retorno = false;
                }
            return retorno;

        }



        private void inicializarRol(Gets_and_Sets.Rol_getset rol)
        {
            rol.Nombre = textBoxNombre.Text;
            rol.Id = idRolAModificar;
            if (Convert.ToString(comboBoxHabilitado.SelectedItem) == "Habilitado")
            {
                rol.Habilitado = 1;
            }
            else
            {
                rol.Habilitado = 0;
            }
        }





    }
}
